package com.fkcai.hansoul.interceptor;

import com.fkcai.hansoul.common.util.JwtUtil;
import com.fkcai.hansoul.common.util.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 登录拦截器
 *
 */
public class LoginInterceptor implements HandlerInterceptor {
	
	@Override
	public boolean preHandle (HttpServletRequest request,
	                          HttpServletResponse response, Object handler) throws Exception {
		// 放行 OPTIONS 预检请求
		if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
			return true;
		}
		
		String authHeader = request.getHeader("Authorization");
		
		// 检查 Authorization 头是否存在且以 Bearer 开头
		if (authHeader == null || !authHeader.startsWith("Bearer ")) {
			response.sendError(401, "未提供有效的 Token");
			
			return false;
		}
		
		// 提取 Token 并彻底清理空格
		String token = authHeader.replace("Bearer ", "") // 移除所有 "Bearer" 字符串（包括意外多写的情况）
				.replaceAll("\\s+", "") // 移除所有空白字符（空格、制表符等）
				.trim();
		
		try {
			String userId = JwtUtil.parseToken(token);
			// 这里可以将用户信息存储到请求属性中，供后面使用
			request.setAttribute("userId", userId);
			
			ThreadLocalUtil.set(userId);
			
			return true;
		} catch (Exception e) {
			response.sendError(401, "无效的 Token：" + e.getMessage());
			
			return false;
		}
	}
	
	@Override
	public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		// 请求完成后清除 ThreadLocal 中的数据，防止内存泄漏。
		ThreadLocalUtil.remove();
	}
}
